package bean;

import java.io.Serializable;
import java.util.Date;
import Persistencia.*;

public class Rodeo implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	//lo puse para la base de datos, en el programa no lo uso, si no sirve se saca
	private Long id;
	
	private String codigo;
	private MovimientoRodeo movimiento;
	private Categoria categoria;
	private Date fecha;
	private String raza;
	private int existenciaInicial;
	private int nacimientos;
	private int muertes;
	private int abortos;
	private int deRodeo;
	private int transferenciaDescarte;
	private int transferenciaRodeo;
	private int ventas;
	private int existenciaFinal;
	
	public Rodeo(String codigo, Categoria categoria,
			Date fecha, String raza) {
		super();
		
		this.codigo = codigo;
		this.categoria = categoria;
		this.fecha = fecha;
		this.raza = raza;
		
	}
	
	public Rodeo(){}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getCodigo() {
		return codigo;
	}

	public MovimientoRodeo getMovimiento() {
		return movimiento;
	}

	public void setMovimiento(MovimientoRodeo movimiento) {
		this.movimiento = movimiento;
	}

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public String getRaza() {
		return raza;
	}

	public void setRaza(String raza) {
		this.raza = raza;
	}

	public int getExistenciaInicial() {
		return existenciaInicial;
	}

	public void setExistenciaInicial(int existenciaInicial) {
		this.existenciaInicial = existenciaInicial;
	}

	public int getNacimientos() {
		return nacimientos;
	}

	public void setNacimientos(int nacimientos) {
		this.nacimientos = nacimientos;
	}

	public int getMuertes() {
		return muertes;
	}

	public void setMuertes(int muertes) {
		this.muertes = muertes;
	}

	public int getAbortos() {
		return abortos;
	}

	public void setAbortos(int abortos) {
		this.abortos = abortos;
	}

	public int getDeRodeo() {
		return deRodeo;
	}

	public void setDeRodeo(int deRodeo) {
		this.deRodeo = deRodeo;
	}

	public int getTransferenciaDescarte() {
		return transferenciaDescarte;
	}

	public void setTransferenciaDescarte(int transferenciaDescarte) {
		this.transferenciaDescarte = transferenciaDescarte;
	}

	public int getTransferenciaRodeo() {
		return transferenciaRodeo;
	}

	public void setTransferenciaRodeo(int transferenciaRodeo) {
		this.transferenciaRodeo = transferenciaRodeo;
	}

	public int getVentas() {
		return ventas;
	}

	public void setVentas(int ventas) {
		this.ventas = ventas;
	}

	public int getExistenciaFinal() {
		return existenciaFinal;
	}

	public void setExistenciaFinal(int existenciaFinal) {
		this.existenciaFinal = existenciaFinal;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + abortos;
		result = prime * result
				+ ((categoria == null) ? 0 : categoria.hashCode());
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		result = prime * result + deRodeo;
		result = prime * result + existenciaFinal;
		result = prime * result + existenciaInicial;
		result = prime * result + ((fecha == null) ? 0 : fecha.hashCode());
		result = prime * result
				+ ((movimiento == null) ? 0 : movimiento.hashCode());
		result = prime * result + muertes;
		result = prime * result + nacimientos;
		result = prime * result + ((raza == null) ? 0 : raza.hashCode());
		result = prime * result + transferenciaDescarte;
		result = prime * result + transferenciaRodeo;
		result = prime * result + ventas;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Rodeo other = (Rodeo) obj;
		if (abortos != other.abortos)
			return false;
		if (categoria == null) {
			if (other.categoria != null)
				return false;
		} else if (!categoria.equals(other.categoria))
			return false;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		if (deRodeo != other.deRodeo)
			return false;
		if (existenciaFinal != other.existenciaFinal)
			return false;
		if (existenciaInicial != other.existenciaInicial)
			return false;
		if (fecha == null) {
			if (other.fecha != null)
				return false;
		} else if (!fecha.equals(other.fecha))
			return false;
		if (movimiento == null) {
			if (other.movimiento != null)
				return false;
		} else if (!movimiento.equals(other.movimiento))
			return false;
		if (muertes != other.muertes)
			return false;
		if (nacimientos != other.nacimientos)
			return false;
		if (raza == null) {
			if (other.raza != null)
				return false;
		} else if (!raza.equals(other.raza))
			return false;
		if (transferenciaDescarte != other.transferenciaDescarte)
			return false;
		if (transferenciaRodeo != other.transferenciaRodeo)
			return false;
		if (ventas != other.ventas)
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Rodeo [abortos=" + abortos + ", categoria=" + categoria
				+ ", codigo=" + codigo + ", deRodeo=" + deRodeo
				+ ", existenciaFinal=" + existenciaFinal
				+ ", existenciaInicial=" + existenciaInicial + ", fecha="
				+ fecha + ", muertes=" + muertes + ", nacimientos="
				+ nacimientos + ", raza=" + raza + ", transferenciaDescarte="
				+ transferenciaDescarte + ", transferenciaRodeo="
				+ transferenciaRodeo + ", ventas=" + ventas + "]";
	}

	//la existencia inicial del dia siguiente es igual a la existencia final del de hoy
	//deberia ser apenas se abre ell programa cuando se obtiene el nuevo movimiento
	//porque sino no se sabe cual es la fecha siguiente
	
	
	private int actualizarExF(int n, int m, int a, int tD, int tR, int v){
		int exF = (n - m - tD - tR - v);
		return exF;
	}
	
	public void modificarRodeo(MovimientoRodeo mov, int ventas){
		int exI = this.existenciaFinal;
		setExistenciaInicial(exI);		
		int nac = mov.getNacimientos();
		setNacimientos(nac);
		int m = mov.getMuertes();
		setMuertes(m);
		int ab = mov.getAbortos();
		setAbortos(ab);
		int tD = mov.getTransferenciaDescarte();
		setTransferenciaDescarte(tD);
		int tR = mov.getTransferenciaRodeo();
		setTransferenciaRodeo(tR);
		setVentas(ventas);
		//calculo existencia final
		int exF = actualizarExF(nac, m, ab, tD, tR, ventas);
		exF = exF + exI;
		setExistenciaFinal(exF);
				
		AdmPersistenciaRodeo.getInstancia().update(this);
	}
	
	public void eliminarRodeo()
	{
		AdmPersistenciaRodeo.getInstancia().delete(this);
	}
	
}
